﻿using System;
using System.Text.RegularExpressions;
using System.Windows.Controls;

namespace Levfier.GUI.EditorControls.Parameters
{
    /// <summary>
    /// スピンボックス
    /// </summary>
    [Serializable]
    public class SpinBox : TextBox
    {
        /// <summary>
        /// 現在の値
        /// </summary>
        public double Value
        {
            get
            {
                return this.value;
            }
            set
            {
                if (value > this.MaxValue)
                {
                    this.value = this.MaxValue;
                }
                else if (value < this.MinValue)
                {
                    this.value = this.MinValue;
                }
                this.value = value;
            }
        }

        /// <summary>
        /// 設定できる値の最大値
        /// </summary>
        public double MaxValue { get; set; }

        /// <summary>
        /// 設定できる値の最小値
        /// </summary>
        public double MinValue { get; set; }

        /// <summary>
        /// 現在の値
        /// </summary>
        private double value;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public SpinBox()
        {
            this.TextChanged += TextBox_TextChanged;
        }

        /// <summary>
        /// 入力内容が変更された時に発生する
        /// 数値以外の入力は受け付けない
        /// </summary>
        /// <param name="sender">イベント元</param>
        /// <param name="e">イベント</param>
        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextBox tb = sender as TextBox;
            
            //数字に関係無い文字列を空白に置き換え
            tb.Text = Regex.Replace(tb.Text, "[^0-9+-.]", "");

            double temp;

            // 置き換えても対応できない場合、強制的に初期値に
            if (!double.TryParse(tb.Text, out temp))
            {
                tb.Text = "";
                this.Value = 0.0d;
            }
            else
            {
                //変換に成功した場合
                this.Value = temp;
            }
        }
    }
}
